package bookstudytest.threadtest.threapool;

import java.util.concurrent.*;

/**
 * @author : Lee
 * @Date: 2018/7/4 09:22
 * @Description: 创建线程池的七个主要参数：
 * corePoolSize：线程池中核心线程的数量
 * maximumPoolSize：线程池中允许的线程数量
 * keepAliveTime：线程池中空闲线程的保留时间
 * TimeUnit: 线程池中空闲线程的保留时间的单位
 * BlockingQueue<Runnable>：阻塞队列，用来存储可执行的任务
 * ThreadFactory ：线程工厂，一般会采用默认工厂
 * RejectedExecutionHandler：队列已满，而且任务量大于最大线程时出现异常的处理策略
 * <p>
 * ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
 * ThreadPoolExecutor.DiscardPolicy：也是丢弃任务，但是不抛出异常。
 * ThreadPoolExecutor.DiscardOldestPolicy：丢弃队列最前面的任务，然后重新尝试执行任务（重复此过程）
 * ThreadPoolExecutor.CallerRunsPolicy：由调用线程处理该任务
 * </p>
 */
public class ThreadPoolDemo {
    public static void main(String[] args) {
        //创建线程池
        ThreadPoolExecutor threadPoolExecutor =
                new ThreadPoolExecutor(3,
                        6, 2600L,
                        TimeUnit.HOURS, new ArrayBlockingQueue<>(5));
        for (int i = 0; i < 200; i++) {
            final int a = i;
            //池内添加线程
            threadPoolExecutor.execute(() ->
                    System.out.println("asda" + a));
        }
        threadPoolExecutor.shutdown();
        //这里的ExecutorService是一个接口，上面说的ThreadPoolExecutor继承了AbstractExecutorService
        //而AbstractExecutorService实现了ExecutorService接口
        ///创建一个缓冲池，缓冲池容量大小为Integer.MAX_VALUE
        ExecutorService executorService = Executors.newCachedThreadPool();
        //创建一个容量为1的缓冲池
        ExecutorService executorService1 = Executors.newSingleThreadExecutor();
        //创建一个指定容量大小的缓冲池
        ExecutorService executorService2 = Executors.newFixedThreadPool(3);
        executorService.shutdown();
        executorService1.shutdown();
        executorService2.shutdown();
    }


}
